import { asyncRouterMap, constantRouterMap } from '@/router'

/**
 * 通过meta.role判断是否与当前用户权限匹配
 * @param roles
 * @param route
 */
function hasPermission(roles, perms, route) {
	  if (!!route.name && !!perms) {
	    if (route.name ==="Index") return true;
	    if (route.name ==="Pages") return true;
	    if (route.name ==="ErrorPages") return true;
	    if (route.name ==="Page401") return true;
	    if (route.name ==="Page404") return true;
	    if (route.name ==="ErrorLog") return true;
	    if (route.name ==="I18n") return true;
	    return perms.some(perm => route.name.includes(perm))
	  } else {
	    return true
	  }
	}

/**
 * 递归过滤异步路由表，返回符合用户角色权限的路由表
 * @param routes asyncRouterMap
 * @param roles
 */
function filterAsyncRouter(routes, roles, perms) {
	  const res = []

	  routes.forEach(route => {
	    const tmp = { ...route }
	    if (hasPermission(roles,perms, tmp)) {
	      if (tmp.children&& tmp.name==="Pages") {
	        tmp.children = filterAsyncRouter(tmp.children, roles,perms)
	      }
	      res.push(tmp)
	    }
	  })

	  return res
	}

const permission = {
  state: {
    routers: [],
    addRouters: []
  },
  mutations: {
    SET_ROUTERS: (state, routers) => {
      state.addRouters = routers
      state.routers = constantRouterMap.concat(routers)
    }
  },
  actions: {
	    GenerateRoutes({ commit }, data) {
	        return new Promise(resolve=> {
	          const { roles, perms} = data.roles
	          let accessedRouters
	          if (roles.includes('admin')) {
	            accessedRouters = asyncRouterMap
	          } else {
	            accessedRouters = filterAsyncRouter(asyncRouterMap, roles,perms)
	          }
	          commit('SET_ROUTERS', accessedRouters)
	          resolve()
	        })
	      }
	    }
	  }

export default permission
